home *** CD-ROM | disk | FTP | other *** search
/ C & C++ Multimedia Cyber Classroom / C and C++ Multimedia Cyber Classroom (Prentice Hall) (1998).iso / cpphtp2 / code.jar / code / ch15 / fig15_16.txt < prev    next >
Text File  |  1998-02-27  |  5KB  |  175 lines

  1. 1   // Fig. 15.16: treenode.h
  2. 2   // Definition of class TreeNode
  3. 3   #ifndef TREENODE_H
  4. 4   #define TREENODE_H
  5. 5   
  6. 6   template< class NODETYPE > class Tree;  // forward declaration
  7. 7   
  8. 8   template< class NODETYPE >
  9. 9   class TreeNode {
  10. 10     friend class Tree< NODETYPE >;
  11. 11  public:
  12. 12     TreeNode( const NODETYPE &d )   
  13. 13        : leftPtr( 0 ), data( d ), rightPtr( 0 ) { }
  14. 14     NODETYPE getData() const { return data; }
  15. 15  private:
  16. 16     TreeNode< NODETYPE > *leftPtr;  // pointer to left subtree
  17. 17     NODETYPE data;
  18. 18     TreeNode< NODETYPE > *rightPtr; // pointer to right subtree
  19. 19  };
  20. 20  
  21. 21  #endif
  22. 22  
  23. 23  
  24. 24  // Fig. 15.16: fig15_16.cpp
  25. 25  // Definition of template class Tree
  26. 26  #ifndef TREE_H
  27. 27  #define TREE_H
  28. 28  
  29. 29  #include <iostream.h>
  30. 30  #include <assert.h>
  31. 31  #include "treenode.h"
  32. 32  
  33. 33  template< class NODETYPE >
  34. 34  class Tree {
  35. 35  public:
  36. 36     Tree();
  37. 37     void insertNode( const NODETYPE & );
  38. 38     void preOrderTraversal() const;
  39. 39     void inOrderTraversal() const;
  40. 40     void postOrderTraversal() const;
  41. 41  private:
  42. 42     TreeNode< NODETYPE > *rootPtr;
  43. 43  
  44. 44     // utility functions
  45. 45     void insertNodeHelper( 
  46. 46             TreeNode< NODETYPE > **, const NODETYPE & );
  47. 47     void preOrderHelper( TreeNode< NODETYPE > * ) const;
  48. 48     void inOrderHelper( TreeNode< NODETYPE > * ) const;
  49. 49     void postOrderHelper( TreeNode< NODETYPE > * ) const;
  50. 50  };
  51. 51  
  52. 52  template< class NODETYPE >
  53. 53  Tree< NODETYPE >::Tree() { rootPtr = 0; }
  54. 54  
  55. 55  template< class NODETYPE >
  56. 56  void Tree< NODETYPE >::insertNode( const NODETYPE &value )
  57. 57     { insertNodeHelper( &rootPtr, value ); }
  58. 58  
  59. 59  // This function receives a pointer to a pointer so the
  60. 60  // pointer can be modified.
  61. 61  template< class NODETYPE >
  62. 62  void Tree< NODETYPE >::insertNodeHelper( 
  63. 63          TreeNode< NODETYPE > **ptr, const NODETYPE &value )
  64. 64  {
  65. 65     if ( *ptr == 0 ) {                   // tree is empty
  66. 66        *ptr = new TreeNode< NODETYPE >( value );
  67. 67        assert( *ptr != 0 );
  68. 68     }
  69. 69     else                              // tree is not empty
  70. 70        if ( value < ( *ptr )->data )
  71. 71           insertNodeHelper( &( ( *ptr )->leftPtr ), value );
  72. 72        else
  73. 73           if ( value > ( *ptr )->data )
  74. 74              insertNodeHelper( &( ( *ptr )->rightPtr ), value );
  75. 75           else
  76. 76              cout << value << " dup" << endl;
  77. 77  }
  78. 78  
  79. 79  template< class NODETYPE > 
  80. 80  void Tree< NODETYPE >::preOrderTraversal() const
  81. 81     { preOrderHelper( rootPtr ); }
  82. 82  
  83. 83  template< class NODETYPE >
  84. 84  void Tree< NODETYPE >::preOrderHelper( 
  85. 85                            TreeNode< NODETYPE > *ptr ) const
  86. 86  {
  87. 87     if ( ptr != 0 ) {
  88. 88        cout << ptr->data << ' ';
  89. 89        preOrderHelper( ptr->leftPtr );
  90. 90        preOrderHelper( ptr->rightPtr );
  91. 91     }
  92. 92  }
  93. 93  
  94. 94  template< class NODETYPE >
  95. 95  void Tree< NODETYPE >::inOrderTraversal() const
  96. 96     { inOrderHelper( rootPtr ); }
  97. 97  
  98. 98  template< class NODETYPE >
  99. 99  void Tree< NODETYPE >::inOrderHelper( 
  100. 100                           TreeNode< NODETYPE > *ptr ) const
  101. 101 {
  102. 102    if ( ptr != 0 ) {
  103. 103       inOrderHelper( ptr->leftPtr );
  104. 104       cout << ptr->data << ' ';
  105. 105       inOrderHelper( ptr->rightPtr );
  106. 106    }
  107. 107 }
  108. 108 
  109. 109 template< class NODETYPE >
  110. 110 void Tree< NODETYPE >::postOrderTraversal() const
  111. 111    { postOrderHelper( rootPtr ); }
  112. 112 
  113. 113 template< class NODETYPE >
  114. 114 void Tree< NODETYPE >::postOrderHelper( 
  115. 115                           TreeNode< NODETYPE > *ptr ) const
  116. 116 {
  117. 117    if ( ptr != 0 ) {
  118. 118       postOrderHelper( ptr->leftPtr );
  119. 119       postOrderHelper( ptr->rightPtr );
  120. 120       cout << ptr->data << ' ';
  121. 121    }
  122. 122 }
  123. 123 
  124. 124 #endif
  125. 125 
  126. 126 
  127. 127 // Fig. 15.16: fig15_16.cpp
  128. 128 // Driver to test class Tree
  129. 129 #include <iostream.h>
  130. 130 #include <iomanip.h>
  131. 131 #include "tree.h"
  132. 132 
  133. 133 int main()
  134. 134 {
  135. 135    Tree< int > intTree;
  136. 136    int intVal;
  137. 137 
  138. 138    cout << "Enter 10 integer values:\n";
  139. 139    for( int i = 0; i < 10; i++ ) {
  140. 140       cin >> intVal;
  141. 141       intTree.insertNode( intVal );
  142. 142    }
  143. 143 
  144. 144    cout << "\nPreorder traversal\n";
  145. 145    intTree.preOrderTraversal();
  146. 146 
  147. 147    cout << "\nInorder traversal\n";
  148. 148    intTree.inOrderTraversal();
  149. 149 
  150. 150    cout << "\nPostorder traversal\n";
  151. 151    intTree.postOrderTraversal();
  152. 152 
  153. 153    Tree< double > doubleTree;
  154. 154    double doubleVal;
  155. 155 
  156. 156    cout << "\n\n\nEnter 10 double values:\n"
  157. 157         << setiosflags( ios::fixed | ios::showpoint )
  158. 158         << setprecision( 1 );
  159. 159    for ( i = 0; i < 10; i++ ) {
  160. 160       cin >> doubleVal;
  161. 161       doubleTree.insertNode( doubleVal );
  162. 162    }
  163. 163 
  164. 164    cout << "\nPreorder traversal\n";
  165. 165    doubleTree.preOrderTraversal();
  166. 166 
  167. 167    cout << "\nInorder traversal\n";
  168. 168    doubleTree.inOrderTraversal();
  169. 169 
  170. 170    cout << "\nPostorder traversal\n";
  171. 171    doubleTree.postOrderTraversal();
  172. 172 
  173. 173    return 0;
  174. 174 }
  175.